import matplotlib.pyplot as plt
import matplotlib.patches as patches
import math

LATITUDE_RANGE = 120  # degree
LONGITUDE_RANGE = 360  # degree
X_PIXEL_RANGE = 61440
Y_PIXEL_RANGE = 184320
MOON_RADIUS = 1737.4  # km
# METER_PER_PIXEL = 59.225
BATCH_SIZE = 960


def mercator_projection(lat, lon):
    """
    Warning ! The unit of latitude and longitude is degree.
    """
    # 这里要加上一半的图像宽度，这是因为标注数据集中的角度是从-60度到+60度，起始位置不为零，因此需要修正。
    x = (60 - lat) * X_PIXEL_RANGE / LATITUDE_RANGE
    # 这里不加一半的图像高度，这是因为标注数据集中的角度是从0到360度的，但是，图像的经度是从-180到+180度的，因此需要修正。
    if lon > 180:
        # y = (lon - 180) * X_PIXEL_RANGE * math.cos(math.radians(lat)) / LATITUDE_RANGE
        y = (lon - 180) * Y_PIXEL_RANGE / LONGITUDE_RANGE
    else:
        # y = (lon + 180) * X_PIXEL_RANGE * math.cos(math.radians(lat)) / LATITUDE_RANGE
        y = (lon + 180) * Y_PIXEL_RANGE / LONGITUDE_RANGE
    return x, y


if __name__ == "__main__":
    left_top = (41.23, 31.23)  # latitude, longitude
    right_bottom = (39.23, 32.23)  # latitude, longitude

    x_left_top, y_left_top = mercator_projection(*left_top)
    x_right_bottom, y_right_bottom = mercator_projection(*right_bottom)

    X_SUB = int(x_left_top / BATCH_SIZE)

    SUBFIG_DIR = "/disk527/sdb1/a804_cbf/datasets/lunar_crater"

    x = 26
    y = 591
    r = 4.41  # km

    R_x = math.degrees(r / MOON_RADIUS) * X_PIXEL_RANGE / LATITUDE_RANGE
    R_y = (
        math.degrees(r / MOON_RADIUS)
        * Y_PIXEL_RANGE
        / LONGITUDE_RANGE
        / math.cos(math.radians(46.8238))
    )
    print(R_x, R_y)
    img = plt.imread(f"{SUBFIG_DIR}/textures/{X_SUB}/txr_{X_SUB}_{Y_SUB}_960.png")

    # 创建一个新的figure
    fig, axe = plt.subplots()

    axe.imshow(img, cmap="gray")
    # 在图像上画出点(x, y)
    # axe.scatter([y], [x], color="red")
    ellipse = patches.Ellipse((y, x), R_y, R_x, edgecolor="red", facecolor="none")

    axe.add_patch(ellipse)
    # 显示图像和点
    fig.savefig("test.png")
